#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


//********************简单TCP网络程序
//********************客户端*************************
//
//TCP协议是建立连接的可靠传输
//1.与服务器建立连接
//2.向服务器发送请求
//3.接收来自服务器端响应



int main(int argc ,char *argv[])
{

  //检查命令行参数
  if(argc!=3)
  {
    printf("Usage : ./client [IP] [Port]\n");
  }
  //1.创建socket
  int fd=socket(AF_INET,SOCK_STREAM,0);
  if(fd<0)
  {
    perror("socket");
    return 1;
  }
  
  //2.建立连接
  
  //将要建立连接的服务器的IP 和 Port 放在结构体中
  sockaddr_in service;
  service.sin_family=AF_INET;
  socklen_t service_len=sizeof(service);
  service.sin_addr.s_addr=inet_addr(argv[1]);
  service.sin_port=htons(atoi(argv[2]));

  int connect_ret=connect(fd,(sockaddr *)&service,service_len);
  if(connect_ret<0)
  {
    perror("connect");
    return 1;
  }
  

  char buf[1024]={0};

  while(1)
  {
    //3.向服务器发送请求
         //从标准输入开始读取数据
    ssize_t read_size=read(0,buf,sizeof(buf)-1);
    if(read_size<0)
    {
      perror("read");
      return 1;
    }
    if(read_size==0)
    {
      printf("done\n");
      return 0;
    }
    buf[read_size]='\0';
        //将数据发送给服务器
   //  int send_ret=sendto(fd,buf,read_size,0,(sockaddr *)&service,service_len);
   // if(send_ret<0)
   // {
   //   perror("sendto");
   //   return 1;
   // }
   
    write(fd,buf,read_size);

    //4.从服务器接收请求
        //构造结构体存放接收方的信息
        //这里的service会作为输出型参数,因为服务器端是任意Ip主机都保持连接状态，这里接收服务的参数，然后打印出来
    char buf_service[1024]={0};
    sockaddr_in peer;

    read_size=read(fd,buf_service,sizeof(buf_service)-1);

    if(read_size<0)
    {
      perror("recvfrom");
      return 1;
    }
    if(read_size==0)
    {
      printf("read done\n");
      return 0;
    }

    buf_service[read_size]='\0';
    //5.将从服务器接收的信息显示到标准输出
    
    printf("service[%s:%d] response :%s",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port),buf_service);

  }

}


